#include "EventLoopThreadPool.h"
#include "EventLoopThread.h"

EventLoopThreadPool::EventLoopThreadPool(EventLoop* baseLoop,const std::string &nameArg)
    : baseLoop_(baseLoop)
    , name_(nameArg)
    , started_(false)
    , numThreads_(0)
    , next_(0)
{}
EventLoopThreadPool::~EventLoopThreadPool()
{
    //不需要析构loop，因为loop是栈变量
}

void EventLoopThreadPool::start(const ThreadInitCallback& cb)
{
    started_ = true;

    for(int i=0;i<numThreads_;i++)
    {
        char buf[name_.size()+32];
        snprintf(buf, sizeof(buf),"%s%d", name_.c_str(),i);
        EventLoopThread* t = new EventLoopThread(cb,buf);
        //当使用 std::unique_ptr<Type>(pointer) 的形式时，这意味着调用了 std::unique_ptr 的构造函数，
        //将 pointer （这里是 t）作为参数传递。
        //是将EventLoopThread对象的指针转换为一个智能指针，然后将其添加到一个vector容器中
        threads_.push_back(std::unique_ptr<EventLoopThread>(t));
        loops_.push_back(t->startLoop()); //底层创建线程，绑定一个新的EventLoop,并返回该loop的地址
    }

    //整个服务端只有一个线程，运行着baseloop
    if(numThreads_==0 && cb)
    {
        cb(baseLoop_);
    }
}

//如果工作在多线程中，baseloop_默认以轮询的方式分配channel给subloop
EventLoop* EventLoopThreadPool::getNextLoop()
{
    EventLoop* loop = baseLoop_;

    if(!loops_.empty()) //通过轮询获取下一个处理事件的loop
    {
        loop = loops_[next_];
        ++next_;
        if(next_>=loops_.size())
        {
            next_ = 0;
        }
    }
    return loop;
}

std::vector<EventLoop*> EventLoopThreadPool::getAllLoops()
{
    if(loops_.empty())
    {
        return std::vector<EventLoop*>(1,baseLoop_);
    }
    else
    {
        return loops_;
    }
}
